number_sections: true

Olist

Olist adalah marketplace yang beroperasi sebagai perusahaan teknologi SaaS (Software as a Service) di segmen e-commerce sejak 2015. Olist menawarkan solusi bagi pemilik toko dari semua ukuran untuk meningkatkan penjualan mereka melalui platform online.

Retrieving Data

Read Data

Dataset yang digunakan berisi informasi transaksi dari September 2016 sampai Oktober 2018. Dataset ini didownload dari https://www.kaggle.com/olistbr/brazilian-ecommerce

Data Inspection

Customers

# A tibble: 6 x 5
  customer_id   customer_unique_id customer_zip_co~ customer_city customer_state
  <chr>         <chr>              <chr>            <chr>         <chr>         
1 06b8999e2fba~ 861eff4711a542e4b~ 14409            franca        SP            
2 18955e83d337~ 290c77bc529b7ac93~ 09790            sao bernardo~ SP            
3 4e7b3e002885~ 060e732b5b29e8181~ 01151            sao paulo     SP            
4 b2b6027bc5c5~ 259dac757896d24d7~ 08775            mogi das cru~ SP            
5 4f2d8ab171c8~ 345ecd01c38d18a90~ 13056            campinas      SP            
6 879864dab9bc~ 4c93744516667ad3b~ 89254            jaragua do s~ SC            

Geolocation

  geolocation_zip_code_prefix geolocation_lat geolocation_lng
1                       98780       -36.60537       -64.28395
2                       28155       -34.58642       -58.73210
3                       96255       -33.69142       -53.48016
4                       96100       -33.52580       -53.36455
5                       96230       -33.52560       -53.36642
6                       96300       -32.56395       -53.38472
         geolocation_city geolocation_state        state_name    region
1              santa rosa                RS Rio Grande do Sul     South
2             santa maria                RJ    Rio de Janeiro Southeast
3                    chui                RS Rio Grande do Sul     South
4 santa vitoria do palmar                RS Rio Grande do Sul     South
5 santa vitoria do palmar                RS Rio Grande do Sul     South
6                jaguarao                RS Rio Grande do Sul     South

sellers

# A tibble: 6 x 4
  seller_id                   seller_zip_code_pref~ seller_city     seller_state
  <chr>                       <chr>                 <chr>           <chr>       
1 3442f8959a84dea7ee197c632c~ 13023                 campinas        SP          
2 d1b65fc7debc3361ea86b5f14c~ 13844                 mogi guacu      SP          
3 ce3ad9de960102d0677a81f5d0~ 20031                 rio de janeiro  RJ          
4 c0f3eea2e14555b6faeea3dd58~ 04195                 sao paulo       SP          
5 51a04a8a6bdcb23deccc82b0b8~ 12914                 braganca pauli~ SP          
6 c240c4061717ac1806ae6ee72b~ 20920                 rio de janeiro  RJ          

Product

# A tibble: 6 x 10
  product_id product_code product_categor~ product_name_le~ product_descrip~
  <chr>      <chr>        <chr>                       <dbl>            <dbl>
1 1e9e8ef04~ PR00001      perfumery                      40              287
2 3aa071139~ PR00002      art                            44              276
3 96bd76ec8~ PR00003      sports_leisure                 46              250
4 cef67bcfe~ PR00004      baby                           27              261
5 9dc1a7de2~ PR00005      housewares                     37              402
6 41d3672d4~ PR00006      musical_instrum~               60              745
# ... with 5 more variables: product_photos_qty <dbl>, product_weight_g <dbl>,
#   product_length_cm <dbl>, product_height_cm <dbl>, product_width_cm <dbl>

orders

# A tibble: 6 x 8
  order_id customer_id order_status order_purchase_tim~ order_approved_at  
  <chr>    <chr>       <chr>        <dttm>              <dttm>             
1 e481f51~ 9ef432eb62~ delivered    2017-10-02 10:56:33 2017-10-02 11:07:15
2 53cdb2f~ b0830fb474~ delivered    2018-07-24 20:41:37 2018-07-26 03:24:27
3 47770eb~ 41ce2a54c0~ delivered    2018-08-08 08:38:49 2018-08-08 08:55:23
4 949d5b4~ f88197465e~ delivered    2017-11-18 19:28:06 2017-11-18 19:45:59
5 ad21c59~ 8ab97904e6~ delivered    2018-02-13 21:18:39 2018-02-13 22:20:29
6 a4591c2~ 503740e9ca~ delivered    2017-07-09 21:57:05 2017-07-09 22:10:13
# ... with 3 more variables: order_delivered_carrier_date <dttm>,
#   order_delivered_customer_date <dttm>, order_estimated_delivery_date <dttm>

Order Items

# A tibble: 6 x 7
  order_id order_item_id product_id seller_id shipping_limit_date price
  <chr>            <dbl> <chr>      <chr>     <dttm>              <dbl>
1 0001024~             1 4244733e0~ 48436dad~ 2017-09-19 09:45:35  58.9
2 00018f7~             1 e5f2d52b8~ dd7ddc04~ 2017-05-03 11:05:13 240. 
3 000229e~             1 c777355d1~ 5b51032e~ 2018-01-18 14:48:30 199  
4 00024ac~             1 7634da152~ 9d7a1d34~ 2018-08-15 10:10:18  13.0
5 00042b2~             1 ac6c36230~ df560393~ 2017-02-13 13:57:51 200. 
6 00048cc~             1 ef92defde~ 6426d21a~ 2017-05-23 03:55:27  21.9
# ... with 1 more variable: freight_value <dbl>

Order Payments

# A tibble: 6 x 5
  order_id         payment_sequent~ payment_type payment_installm~ payment_value
  <chr>                       <dbl> <chr>                    <dbl>         <dbl>
1 b81ef226f3fe178~                1 credit_card                  8          99.3
2 a9810da82917af2~                1 credit_card                  1          24.4
3 25e8ea4e93396b6~                1 credit_card                  1          65.7
4 ba78997921bbcdc~                1 credit_card                  8         108. 
5 42fdf880ba16b47~                1 credit_card                  2         128. 
6 298fcdf1f73eb41~                1 credit_card                  2          96.1

Order Reviews

# A tibble: 6 x 7
  review_id order_id review_score review_comment_~ review_comment_~
  <chr>     <chr>           <dbl> <chr>            <chr>           
1 7bc24061~ 73fc7af~            4 <NA>             <NA>            
2 80e641a1~ a548910~            5 <NA>             <NA>            
3 228ce550~ f9e4b65~            5 <NA>             <NA>            
4 e64fb393~ 658677c~            5 <NA>             Recebi bem ante~
5 f7c4243c~ 8e6bfb8~            5 <NA>             Parabéns lojas ~
6 15197aa6~ b18dcdf~            1 <NA>             <NA>            
# ... with 2 more variables: review_creation_date <dttm>,
#   review_answer_timestamp <dttm>

Data Preparation

Data Cleansing

Customers

Data Structure

Observations: 99,441
Variables: 5
$ customer_id              <chr> "06b8999e2fba1a1fbc88172c00ba8bc7", "18955...
$ customer_unique_id       <chr> "861eff4711a542e4b93843c6dd7febb0", "290c7...
$ customer_zip_code_prefix <chr> "14409", "09790", "01151", "08775", "13056...
$ customer_city            <chr> "franca", "sao bernardo do campo", "sao pa...
$ customer_state           <chr> "SP", "SP", "SP", "SP", "SP", "SC", "SP", ...

Missing Value

             customer_id       customer_unique_id customer_zip_code_prefix 
                       0                        0                        0 
           customer_city           customer_state 
                       0                        0 

Duplicate Value

   data data_unique
1 99441       99441

Geolocation

Data Structure

Observations: 19,015
Variables: 7
$ geolocation_zip_code_prefix <chr> "98780", "28155", "96255", "96100", "96...
$ geolocation_lat             <dbl> -36.60537, -34.58642, -33.69142, -33.52...
$ geolocation_lng             <dbl> -64.28395, -58.73210, -53.48016, -53.36...
$ geolocation_city            <chr> "santa rosa", "santa maria", "chui", "s...
$ geolocation_state           <chr> "RS", "RJ", "RS", "RS", "RS", "RS", "RS...
$ state_name                  <chr> "Rio Grande do Sul", "Rio de Janeiro", ...
$ region                      <chr> "South", "Southeast", "South", "South",...

Missing Value

geolocation_zip_code_prefix             geolocation_lat 
                          0                           0 
            geolocation_lng            geolocation_city 
                          0                           0 
          geolocation_state                  state_name 
                          0                           0 
                     region 
                          0 

Duplicate Value

   data data_unique
1 19015       19015

Sellers

Data Structure

Observations: 3,095
Variables: 4
$ seller_id              <chr> "3442f8959a84dea7ee197c632cb2df15", "d1b65fc...
$ seller_zip_code_prefix <chr> "13023", "13844", "20031", "04195", "12914",...
$ seller_city            <chr> "campinas", "mogi guacu", "rio de janeiro", ...
$ seller_state           <chr> "SP", "SP", "RJ", "SP", "SP", "RJ", "PE", "S...

Missing Value

             seller_id seller_zip_code_prefix            seller_city 
                     0                      0                      0 
          seller_state 
                     0 

Duplicate Value

  data data_unique
1 3095        3095

Product

Data Structure

Observations: 32,951
Variables: 10
$ product_id                 <chr> "1e9e8ef04dbcff4541ed26657ea517e5", "3aa...
$ product_code               <chr> "PR00001", "PR00002", "PR00003", "PR0000...
$ product_category_name      <chr> "perfumery", "art", "sports_leisure", "b...
$ product_name_lenght        <dbl> 40, 44, 46, 27, 37, 60, 56, 56, 57, 36, ...
$ product_description_lenght <dbl> 287, 276, 250, 261, 402, 745, 1272, 184,...
$ product_photos_qty         <dbl> 1, 1, 1, 1, 4, 1, 4, 2, 1, 1, 1, 4, 3, 2...
$ product_weight_g           <dbl> 225, 1000, 154, 371, 625, 200, 18350, 90...
$ product_length_cm          <dbl> 16, 30, 18, 26, 20, 38, 70, 40, 27, 17, ...
$ product_height_cm          <dbl> 10, 18, 9, 4, 17, 5, 24, 8, 13, 10, 10, ...
$ product_width_cm           <dbl> 14, 20, 15, 26, 13, 11, 44, 40, 17, 12, ...

Missing Value

                product_id               product_code 
                         0                          0 
     product_category_name        product_name_lenght 
                       610                        610 
product_description_lenght         product_photos_qty 
                       610                        610 
          product_weight_g          product_length_cm 
                         2                          2 
         product_height_cm           product_width_cm 
                         2                          2 

cukup banyak data produk yang kosong, namun kita biarkan saja dulu karena variabel tersebut kurang berpengaruh pada projek ini.

Duplicate Value

   data data_unique
1 32951       32951

Orders

Data Structure

Observations: 99,441
Variables: 8
$ order_id                      <chr> "e481f51cbdc54678b7cc49136f2d6af7", "...
$ customer_id                   <chr> "9ef432eb6251297304e76186b10a928d", "...
$ order_status                  <chr> "delivered", "delivered", "delivered"...
$ order_purchase_timestamp      <dttm> 2017-10-02 10:56:33, 2018-07-24 20:4...
$ order_approved_at             <dttm> 2017-10-02 11:07:15, 2018-07-26 03:2...
$ order_delivered_carrier_date  <dttm> 2017-10-04 19:55:00, 2018-07-26 14:3...
$ order_delivered_customer_date <dttm> 2017-10-10 21:25:13, 2018-08-07 15:2...
$ order_estimated_delivery_date <dttm> 2017-10-18, 2018-08-13, 2018-09-04, ...

Ubah tipe data order_status menjadi factor:

Missing Value

                     order_id                   customer_id 
                            0                             0 
                 order_status      order_purchase_timestamp 
                            0                             0 
            order_approved_at  order_delivered_carrier_date 
                          160                          1783 
order_delivered_customer_date order_estimated_delivery_date 
                         2965                             0 

Duplicate Value

   data data_unique
1 99441       99441

Order Items

Data Structure

Observations: 112,650
Variables: 7
$ order_id            <chr> "00010242fe8c5a6d1ba2dd792cb16214", "00018f77f2...
$ order_item_id       <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,...
$ product_id          <chr> "4244733e06e7ecb4970a6e2683c13e61", "e5f2d52b80...
$ seller_id           <chr> "48436dade18ac8b2bce089ec2a041202", "dd7ddc04e1...
$ shipping_limit_date <dttm> 2017-09-19 09:45:35, 2017-05-03 11:05:13, 2018...
$ price               <dbl> 58.90, 239.90, 199.00, 12.99, 199.90, 21.90, 19...
$ freight_value       <dbl> 13.29, 19.93, 17.87, 12.79, 18.14, 12.69, 11.85...

Missing Value

           order_id       order_item_id          product_id           seller_id 
                  0                   0                   0                   0 
shipping_limit_date               price       freight_value 
                  0                   0                   0 

Duplicate Value

   data data_unique
1 99441       99441

Order Payments

Data Structure

Observations: 103,886
Variables: 5
$ order_id             <chr> "b81ef226f3fe1789b1e8b2acac839d17", "a9810da82...
$ payment_sequential   <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
$ payment_type         <chr> "credit_card", "credit_card", "credit_card", "...
$ payment_installments <dbl> 8, 1, 1, 8, 2, 2, 1, 3, 6, 1, 8, 1, 1, 5, 4, 1...
$ payment_value        <dbl> 99.33, 24.39, 65.71, 107.78, 128.45, 96.12, 81...

Merubah tipe data payment_type:

Missing Value

            order_id   payment_sequential         payment_type 
                   0                    0                    0 
payment_installments        payment_value 
                   0                    0 

Duplicate Value

    data data_unique
1 103886       99440

Terdapat data pembayaran yang duplikat karena terdapat order yang melakukan pembayaran secara cicilan sehingga tidak menjadi masalah, namun nantinya tetap akan disesuaikan dengan kebutuhan.

Order Reviews

Data Structure

Observations: 100,000
Variables: 7
$ review_id               <chr> "7bc2406110b926393aa56f80a40eba40", "80e641...
$ order_id                <chr> "73fc7af87114b39712e6da79b0a377eb", "a54891...
$ review_score            <dbl> 4, 5, 5, 5, 5, 1, 5, 5, 5, 4, 5, 5, 4, 4, 3...
$ review_comment_title    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, "recome...
$ review_comment_message  <chr> NA, NA, NA, "Recebi bem antes do prazo esti...
$ review_creation_date    <dttm> 2018-01-18, 2018-03-10, 2018-02-17, 2017-0...
$ review_answer_timestamp <dttm> 2018-01-18 21:46:59, 2018-03-11 03:05:13, ...

Missing Value

              review_id                order_id            review_score 
                      0                       0                       0 
   review_comment_title  review_comment_message    review_creation_date 
                  88287                   58255                       0 
review_answer_timestamp 
                      0 

Untuk sementara data review_comment_title dan review_comment_message yang NULL tidak masalah karena tidak masuk ke goal yang ingin dicapai.

Duplicate Value

    data data_unique
1 100000       99173

Terdapat data review yang duplikat karena terdapat order yang memberikan review lebih dari 1 kali.

Combining Data

Data: Customer Order

Berikut ini merupakan data transaksi customer yang didapat dari hasil merge/join antara data customer, orders, order_item, order_review, seller dan geolocation. Berikut struktur data dan pengecekan missing value:

Data Structure:

Observations: 113,417
Variables: 31
$ order_id                      <chr> "2e7a8482f6fb09756ca50c10d7bfc047", "...
$ order_status                  <fct> shipped, shipped, canceled, canceled,...
$ order_purchase_timestamp      <dttm> 2016-09-04 21:15:19, 2016-09-04 21:1...
$ order_approved_at             <dttm> 2016-10-07 13:18:03, 2016-10-07 13:1...
$ order_delivered_carrier_date  <dttm> 2016-10-18 13:14:51, 2016-10-18 13:1...
$ order_delivered_customer_date <dttm> NA, NA, NA, NA, 2016-11-09 07:47:38,...
$ order_estimated_delivery_date <dttm> 2016-10-20, 2016-10-20, 2016-10-28, ...
$ customer_unique_id            <chr> "b7d76e111c89f7ebf14761390f0f7d17", "...
$ customer_zip_code_prefix      <chr> "69309", "69309", "99025", "12244", "...
$ customer_lat                  <dbl> 2.812997, 2.812997, -28.261098, -23.2...
$ customer_lng                  <dbl> -60.69526, -60.69526, -52.40767, -45....
$ customer_city                 <chr> "boa vista", "boa vista", "passo fund...
$ customer_state_code           <fct> RR, RR, RS, SP, SP, SP, SP, SP, SP, R...
$ customer_state_name           <fct> Roraima, Roraima, Rio Grande do Sul, ...
$ customer_region               <fct> North, North, South, Southeast, South...
$ order_item_id                 <dbl> 1, 2, 1, NA, 1, 2, 3, 1, 1, 1, 1, 1, ...
$ product_id                    <chr> "c1488892604e4ba5cff5b4eb4d595400", "...
$ product_code                  <chr> "PR29132", "PR12485", "PR09187", NA, ...
$ product_category_name         <chr> "furniture_decor", "furniture_decor",...
$ price                         <dbl> 39.99, 32.90, 59.50, NA, 44.99, 44.99...
$ freight_value                 <dbl> 31.67, 31.67, 15.56, NA, 2.83, 2.83, ...
$ review_score                  <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 3, 1...
$ seller_id                     <chr> "1554a68530182680ad5c8b042c3ab563", "...
$ shipping_limit_date           <dttm> 2016-10-26 18:25:19, 2016-10-26 18:2...
$ seller_zip_code_prefix        <chr> "37580", "37580", "81050", NA, "81810...
$ seller_lat                    <dbl> -22.42881, -22.42881, -25.49504, NA, ...
$ seller_lng                    <dbl> -46.56955, -46.56955, -49.29960, NA, ...
$ seller_city                   <chr> "monte siao", "monte siao", "curitiba...
$ seller_state_code             <fct> MG, MG, PR, NA, PR, PR, PR, SP, PR, S...
$ seller_state_name             <fct> Minas Gerais, Minas Gerais, Paraná, N...
$ seller_region                 <fct> Southeast, Southeast, South, NA, Sout...

Missing Value:

                     order_id                  order_status 
                            0                             0 
     order_purchase_timestamp             order_approved_at 
                            0                           156 
 order_delivered_carrier_date order_delivered_customer_date 
                         1961                          3221 
order_estimated_delivery_date            customer_unique_id 
                            0                             0 
     customer_zip_code_prefix                  customer_lat 
                            0                           305 
                 customer_lng                 customer_city 
                          305                             0 
          customer_state_code           customer_state_name 
                          305                           305 
              customer_region                 order_item_id 
                          305                           767 
                   product_id                  product_code 
                          767                           767 
        product_category_name                         price 
                         2370                           767 
                freight_value                  review_score 
                          767                             0 
                    seller_id           shipping_limit_date 
                          767                           767 
       seller_zip_code_prefix                    seller_lat 
                          767                          1020 
                   seller_lng                   seller_city 
                         1020                           767 
            seller_state_code             seller_state_name 
                         1020                          1020 
                seller_region 
                         1020 

Cukup banyak data geolocation yang kosong maka perlu kita sesuaikan. Data geolocation yang null akan dilakukan imputasi menggunakan rata-rata latitude dan longitude dari setiap customer dan pelanggan yang berada pada kota/state yang sama.

                  seller_id      seller_zip_code_prefix 
                          0                           0 
                seller_city                seller_state 
                          0                           0 
geolocation_zip_code_prefix             geolocation_lat 
                          5                           5 
            geolocation_lng            geolocation_city 
                          5                           5 
          geolocation_state                  state_name 
                          5                           5 
                     region 
                          5 

Re-combine Data Customer Order:

Missing value after re-combine

                     order_id                  order_status 
                            0                             0 
     order_purchase_timestamp             order_approved_at 
                            0                           156 
 order_delivered_carrier_date order_delivered_customer_date 
                         1961                          3221 
order_estimated_delivery_date            customer_unique_id 
                            0                             0 
     customer_zip_code_prefix                  customer_lat 
                            0                             0 
                 customer_lng                 customer_city 
                            0                             0 
          customer_state_code           customer_state_name 
                            0                             0 
              customer_region                 order_item_id 
                            0                           767 
                   product_id                  product_code 
                          767                           767 
        product_category_name                         price 
                         2370                             0 
                freight_value                  review_score 
                            0                             0 
                    seller_id           shipping_limit_date 
                          767                           767 
       seller_zip_code_prefix                    seller_lat 
                          767                           767 
                   seller_lng                   seller_city 
                          767                           767 
            seller_state_code             seller_state_name 
                          767                           767 
                seller_region 
                          767 

Dapat dilihat masih terdapat missing value pada data order_item_id, product_id,price, geolocation seller, hal ini terjadi pada order yang memiliki status canceled dan unavailable, sehingga tidak masalah karena menandakan bahwa customer tidak jadi melakukan order. Kemudian terdapat missing value juga pada data order_approved_at , order_delivered_carrier_date dan order_delivered_customer_date, namun tidak menjadi masalah karena sementara ini variabel tersebut tidak menjadi fokus di projek ini. Berikut 10 data Customer Order teratas:

# A tibble: 10 x 31
   order_id order_status order_purchase_tim~ order_approved_at  
   <chr>    <fct>        <dttm>              <dttm>             
 1 2e7a848~ shipped      2016-09-04 21:15:19 2016-10-07 13:18:03
 2 2e7a848~ shipped      2016-09-04 21:15:19 2016-10-07 13:18:03
 3 e5fa5a7~ canceled     2016-09-05 00:15:34 2016-10-07 13:17:15
 4 809a282~ canceled     2016-09-13 15:24:19 2016-10-07 13:16:46
 5 bfbd0f9~ delivered    2016-09-15 12:16:38 2016-09-15 12:16:38
 6 bfbd0f9~ delivered    2016-09-15 12:16:38 2016-09-15 12:16:38
 7 bfbd0f9~ delivered    2016-09-15 12:16:38 2016-09-15 12:16:38
 8 71303d7~ canceled     2016-10-02 22:07:52 2016-10-06 15:50:56
 9 3b697a2~ delivered    2016-10-03 09:44:50 2016-10-06 15:50:54
10 be5bc2f~ delivered    2016-10-03 16:56:50 2016-10-06 16:03:44
# ... with 27 more variables: order_delivered_carrier_date <dttm>,
#   order_delivered_customer_date <dttm>, order_estimated_delivery_date <dttm>,
#   customer_unique_id <chr>, customer_zip_code_prefix <chr>,
#   customer_lat <dbl>, customer_lng <dbl>, customer_city <chr>,
#   customer_state_code <fct>, customer_state_name <fct>,
#   customer_region <fct>, order_item_id <dbl>, product_id <chr>,
#   product_code <chr>, product_category_name <chr>, price <dbl>,
#   freight_value <dbl>, review_score <dbl>, seller_id <chr>,
#   shipping_limit_date <dttm>, seller_zip_code_prefix <chr>, seller_lat <dbl>,
#   seller_lng <dbl>, seller_city <chr>, seller_state_code <fct>,
#   seller_state_name <fct>, seller_region <fct>

Data: Order Payment

Berikut ini data pembayaran per-setiap order yang merupakan hasil merge/join dari data customer, order dan order_payment. Perlu diketahui bahwa Olist mendukung fitur sistem pembayaran kredit dan juga multi-payment. Berikut struktur data dan pengecekan missing value:

Data Structure:

Observations: 99,433
Variables: 8
$ order_id           <chr> "00010242fe8c5a6d1ba2dd792cb16214", "00018f77f2f...
$ payment_sequential <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ boleto             <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 34.59, 0.00, 0.00,...
$ credit_card        <dbl> 72.19, 259.83, 216.87, 25.78, 218.04, 0.00, 31.7...
$ debit_card         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ not_defined        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ voucher            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
$ total_payment      <dbl> 72.19, 259.83, 216.87, 25.78, 218.04, 34.59, 31....

Missing Value:

          order_id payment_sequential             boleto        credit_card 
                 0                  0                  0                  0 
        debit_card        not_defined            voucher      total_payment 
                 0                  0                  0                  0 

Informasi diatas menunjukan tidak terdapat missing value dari data Order Payment. Berikut 10 data Order Payment teratas:

# A tibble: 10 x 8
   order_id payment_sequent~ boleto credit_card debit_card not_defined voucher
   <chr>               <int>  <dbl>       <dbl>      <dbl>       <dbl>   <dbl>
 1 0001024~                1    0          72.2          0           0       0
 2 00018f7~                1    0         260.           0           0       0
 3 000229e~                1    0         217.           0           0       0
 4 00024ac~                1    0          25.8          0           0       0
 5 00042b2~                1    0         218.           0           0       0
 6 00048cc~                1   34.6         0            0           0       0
 7 00054e8~                1    0          31.8          0           0       0
 8 000576f~                1    0         881.           0           0       0
 9 0005a1a~                1    0         158.           0           0       0
10 0005f50~                1    0          65.4          0           0       0
# ... with 1 more variable: total_payment <dbl>


Exploratory Data Analysis

Count of Order by Status

Data divisualisasikan menggunakan Log(Order Frequency) supaya frekuensi minimun tetap dapat terlihat jelas. Perlu diketahui, data Order ini memiliki beberapa status antara lain:
1. Processing : Status setelah customer melakukan order.
2. Unavailable : Satatus ketika penjual menyatakan stock produk tidak tersedia setelah customer melakukan order.
3. Canceled : Status ketika customer membatalkan order.
4. Approved : Status ketika order disetujui oleh penjual.
5. Invoiced : Status ketika order sudah dibayar oleh customer.
6. Shipped : Status ketika produk sedang dikirimkan oleh penjual ke customer.
7. Delivered : status ketika produk sudah sampai pada customer.

Chart diatas menunjukan jumlah order dengan status Delivered jauh lebih banyak dari yang lainnya pada setiap bulan dari 2016-2018 kecuali pada bulan September-Oktober 2018. Jika dilihat pada bulan September-Oktober 2018 hanya terdapat 1 order berstatus Shipped dan 19 order berstatus Cancelled dan tidak ada order yang berstatus Delivered, sehingga membutikan belum penjualan yang berhasil, kecuali 1 order Shipped tersebut. Mari kita lihat data ordernya.

Growth of Order Frequency

Chart diatas menunjukan frekuensi order pada setiap bulannya dari September 2016 - Oktober 2018. Jika dilihat dari frekuensi order tahun 2016 sangat kecil, namun relatif stabil dan meningkat dari januari 2017 - Agustus 2018. Kemudian terjadi penurunan frekuensi order sangat tinggi pada bulan September-Oktober 2018 dari 7308 order menurun hinga 20 order. Berdasarkan visualisasi status order sebelumnya, 20 order pada bulan September-Oktober 2018 terdiri dari 19 order Cancelled dan 1 order shipped. Produk yang dijual pada Olist terdiri dari berbagai macam jenis dan berbagai macam harga, mari kita lihat order amount nya.

Growth of Order Amount

Terkait penurunan order pada bulan september-Oktober 2018, bisa dilihat order amount bulan september 2018 hanya R$ 166.46 yang merupakan amount dari 1 order yang berstatus Shipped dan karena pada OKtober 2018 seluruh order bersatus Cancelled maka total amount-nya nol(0). Namun secara keseluruhan, dapat dilihat pola visualisasi order amount dan frekuensi order cukup sama. Hal ini menunjukan, frekuensi Order sangat berpengaruh untuk menentukan jumlah order amount, dalam artian hampir dipastikan setiap order memiliki amount disekitar rata-rata, kecuali bulan Agustus 2018, Pada chart frekuensi order menunjukan bulan Agustus 2018 terdapat kenaikan frekuensi order namun pada chart total order amount justru mengalami penurunan. Mengapa?

# A tibble: 3 x 4
# Groups:   year [1]
   year month freq_order mean_order_amount
  <dbl> <dbl>      <int>             <dbl>
1  2018     6       6167              166.
2  2018     7       6292              168.
3  2018     8       6512              154.

Data diatas menunjukan pada bulan Agustus 2018, rata-rata order amount lebih rendah sehingga mengakibatkan total order amount menjadi lebih rendah. Meskipun begitu, secara keseluruhan frekuensi order sangat berpengaruh terhadap total order amount sehingga kita bisa mengabaikan efek rata-rata order amount perbulan. Berdasarkan case ini dapat disimpulkan bahwa jumlah order amount dapat meningkat jika frekuensi order bertambah, sehingga muncul pertanyaan Bagaimana cara meningkatkan frekuensi order? Tentunya dengan mencari customer baru untuk melakukan order, namun bisa juga apabila jika fokus meningkatkan frekuensi order daripada customer yang sudah ada, sehingga pertanyaannya berubah menjadi Bagaimana meningkatkan frekuensi order daripada customer yang ada?. Oke sebelum sampai kesitu mari kita cek seberapa besar seorang customer melakukan pembelian berulang.

Repeat order paling banyak terjadi 17 kali dan hanya dilakukan oleh 1 orang customer. Selain itu, 97% Customer hanya melakukan 1 kali order. Dalam case ini saya berasumsi bahwa Olist kurang berupaya untuk meningkatkan frekuensi order dari customer yang ada, cukup disayangkan mengingat jumlah customer yang ada tidak sedikit. Terkait chart diatas, maka seharusnya frekuensi order berbanding lurus dengan pertumbuhan customer baru yang melakukan order. Mari kita cek.

Bisa dilihat pola visualisasi chart diatas relatif sama dengan pola visualisasi frekuensi order dan pola visualisasi total order amount, maka seharusnya jumlah customer akan sangat mempengaruhi total order amount yang ada, berikut pengecekannya:

Chart diatas memperjelas bahwa semakin meningkat jumlah customer maka semakin meningkat total order amount. Sangat baik Olist selalu mampu mendapatkan customer baru, meskipun begitu dapat dilihat karena pada September-Oktober 2018 jumlah customer baru hanya 18 orang sehingga menyebabkan total order amount menurun drastis. Saya berpendapat bahwa akan sangat baik apabila Olist mempertimbangkan customer yang sudah ada untuk meningkatkan frekuensi order dan total order amount. Mari kita lihat total order amount dan total customer pada setiap negara bagian di Brazil.

Order Amount & Customer by State

Sao Paulo memiliki total order amount paling tinggi dengan proporsi 37.4% dari total order amount keseluruhan dan jauh lebih tinggi dari negara bagian lainnya. Mari kita cek jumlah customernya.

Total customer paling banyak di Sao Paulo dengan proporsi 41.8% dari jumlah keseluruhan customer dan juga jauh lebih tinggi dari negara bagian lainnya. Hal ini masuk akal, mengingat jumlah customer sangat mempengaruhi total order amount. Dalam case ini, dapat dipastikan Sao Paulo adalah negara bagian yang paling memiliki potensi untuk meningkatkan conversion rate dan customer retention.

Top 10 Product Category by Order

Chart diatas memberikan informasi 10 kategori produk yang paling banyak diorder dari tahun 2016-2018. Jika dilihat kategori produk yang konsisten masuk kategori top 10 product category dari 2016-2018 adalah Health Beauty, Sports Leisure, Funiture Decor, Computers Accessories dan Housewares. Jika dilihat secara keseluruhan, kategori produk Health Beauty menjadi tren produk nomor 1 yang diorder, namun jika secara quantity produk kategori bed bath table yang paling banyak di-order meskipun produk kategori bed bath table tidak masuk top 10 product category di tahun 2016. Berdasarkan case ini jika kita hendak merekomendasikan berdasarkan tren maka kategori produk Health Beauty jelas punya pasar setiap tahunnya, namun jika kita hendak merekomendasikan berdasarkan jumlah order maka produk kategori bed bath table karena jumlah ordernya paling tinggi dan berkelanjutan dari 2017-2018.

Top 10 Product by Order

Chart diatas memberikan informasi 10 produk yang paling banyak di-order dan menunjukan tren produk di-order dari 2016-2018. Jika dilihat 10 produk yang paling banyak dibeli ditahun 2016 tidak masuk ke top 10 product lagi ditahun 2017 dan 2018. Jika dilihat produk PR14052, PR30294, PR04599 masuk kategori top 10 product pada tahun 2017 dan 2018 sehingga kemungkinan produk tersebut masuk tren ditahun selanjutnya lebih besar. Namun jika dilihat secara keseluruhan, tren Top 10 Product produk terjual setiap tahunnya relatif berbeda sehingga akan sulit memastikan rekomendasi produk yang spesifik ke setiap customer setiap tahunnya.

Top 10 Product by Rating

Data Rating diatas diambil berdasarkan total rating yang didapatkan dari setiap produk. Masing-masing produk diberikan rating 1 - sampai 5 setiap kali ketika customer selesai melakukan order. Alasanya menggunakan jumlah rating karena tidak semua produk memiliki total order quantity yang sama. Chart diatas juga menunjukan tren produk yang berbeda setiap tahunnya. Rating sendiri bisa kita gunakan untuk menentukan rekomendasi produk kepada customer dengan mencari tingkat similarity dari masing-masing produk, namun tantangannya 97% customer hanya melakukan 1 kali order yang dimana setiap order hanya terdiri dari 1 produk. Berdasarkan case ini mungkin kita bisa mempertimbangkan variabel lain yang digunakan untuk menentukan rekomendasi produk secara personal.



EDA Conclusion

Olist sangat baik dalam mendatangkan customer baru. Hal ini dibuktikan 97% transaksi dihasilkan oleh customer baru. Namun mengingat hanya 3% Customer yang melakukan repeat order dari September 2016-Oktober 2018, saya berasumsi bahwa Olist kurang memperhatikan customer lama atau customer yang sudah melakukan order sebelumnya. Melihat data order pada September-Oktober 2018, jumlah customer baru hanya 18 orang sehingga mengakibatkan penurunan frekuensi order yang drastis dari bulan sebelumnya. Hal ini menunjukan frekuensi order pada Olist sangat bergantung pada pertumbuhan customer baru, sehingga saya menyarankan supaya Olist juga dapat mempertimbangkan untuk meningkatkan frekuensi order pada customer yang sudah ada. Jika berdasarkan visualisasi diatas, langkah awal yang dapat diambil yaitu memberikan promosi dan rekomendasi produk-produk terlaris dan sedang tren kepada customer yang berada di negara bagian Sao Paulo, Rio de Janeiro, Minas Gerais, Rio Grande do Sul dan Parana. Namun supaya upaya tersebut lebih optimal, saya juga menyarankan Olist untuk melakukan segmentasi terhadap customer yang sudah ada supaya target pasarnya bisa lebih tepat dan tentunya akan lebih menghemat waktu dan biaya pemasaran.



RFM Model

Jika dilihat berdasarkan data sebelumnya, metode analisis RFM cocok untuk diterapkan. Metode analisis Recency, Frequency, Monetary Value (RFM) adalah salah satu metode analisis perilaku pelanggan berdasarkan histori transaksinya. Metode analisis RFM dapat menjelaskan:

  1. Seberapa baru pelanggan melakukan transaksi?
  2. Seberapa sering pelanggan melaukan transaksi?
  3. Seberapa besar transaksi yang sudah dilakukan pelanggan?

Output dari analisis RFM dapat digunakan untuk melakukan segmentasi pelanggan. Sesuai artikel yang dipublish oleh www.marketeers, GO-JEK adalah salah satu perusahaan yang menggunakan metode analisis RFM dalam menentukan segmentasi pelanggan. GO-JEK membagi segmentasi pelanggan ke dalam empat kelas, yaitu Gold, Silver, Bronze, dan Non-Profit. Segmentasi Gold memiliki kualifikasi konsumen dengan high monetary, high frequency, dan high recency. Silver memiliki kualifikasi konsumen dengan tingkat monetary yang tinggi, frequency yang rendah, dan recency yang tinggi. Kategori Bronze terdiri dari konsumen dengan tingkat monetary rendah, frequency, dan recency yang tinggi. Sementara segmentasi Non-Profit memiliki kualifikasi konsumen dengan kualifikasi monetary, frequency, dan recency yang rendah.

Dalam case Olist ini, dataset berisikan data transaksi dari 2016-09-04 sampai 2018-10-17 sehinnga berikut perlakukan value RFM untuk case ini:

  1. Recency : Selisih antara hari terakhir pelanggan melakukan transaksi dan hari melakukan analisis. Dalam nilai ini terdapat sedikit penyesuaian, berhubung data transaksi terakhir 2018-10-17, maka hari melakukan analisis saya set default 2018-10-18.
  2. Frequency : Jumlah transaksi yang dilakukan oleh pelanggan dari 2016-09-04 sampai 2018-10-17.
  3. Monetary : Jumlah total order amount yang sudah dikeluarkan pelanggan dari 2016-09-04 sampai 2018-10-17.

Berikut 10 data teratas dari Customer RFM Model yang dibuat:

                customer_unique_id customer_lat customer_lng customer_city
1 0000366f3b9a7992bf8c76cfdf3221e2    -23.33533    -46.82865       cajamar
2 0000b849f77a49e4a4ce2b2a4ca5be3f    -23.56739    -46.79296        osasco
3 0000f46a3911fa3c0805444483337064    -27.54379    -48.62568      sao jose
  customer_state_code customer_state_name customer_region         first_order
1                  SP           São Paulo       Southeast 2018-05-10 10:56:27
2                  SP           São Paulo       Southeast 2018-05-07 11:11:27
3                  SC      Santa Catarina           South 2017-03-10 21:05:03
           last_order min_product_price max_product_price total_price
1 2018-05-10 10:56:27             129.9             129.9       129.9
2 2018-05-07 11:11:27              18.9              18.9        18.9
3 2017-03-10 21:05:03              69.0              69.0        69.0
  total_freight recency frequency monetary recency_score frequency_score
1         12.00     161         1   141.90             4               1
2          8.29     164         1    27.19             4               1
3         17.22     587         1    86.22             1               1
  monetary_score rfm_score
1              4       414
2              1       411
3              2       112
 [ reached 'max' / getOption("max.print") -- omitted 7 rows ]

Total Customer by Recency Score

Semakin tinggi nilai Recency maka semakin jauh jarak seorang customer melakukan order terakhirnya. Jika dilihat proporsi jumlah customer berdasar recency score-nya cukup seimbang.

Total Customer by Frequency Score

Semakin tinggi Frequency Score maka semakin banyak melakukan order (Repeat Order). Berdasarkan chart diatas, data kita hanya memiliki Frequency Score 1 dan 5 dengan proporsi yang tidak seimbang. Hal ini sesuai dengan analisa sebelumnya, Frequency Score 1 merupakan data customer yang hanya melakukan 1 kali order dan Frequency Score > 5 merupakan data customer yang melakukan order lebih dari 1 kali.

Total Customer by Monetary Score

Semakin tinggi Monetary Score, maka semakin banyak total order amount yang dikeluarkan seorang customer. Berdasarkan chart diatas, data kita memiliki Monetary Score 1 sampai 5 dengan proporsi yang relatif seimbang.